﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using GestionePolveri2.DAL;
using GestionePolveriLib.BL;
using FrameworkLib.Facades;
using System.Collections.Specialized;

namespace GestionePolveriLib.Facades
{
    [Serializable]
    public class FamigliaColoriFacade : FacadeBase<GestionePolveriEntities>
    {
        public FamigliaColoriFacade()
        {

        }

        public void LoadAsync(BackgroundWorkerCallbackBase.Callback callback)
        {
            this.RunAsync(() => GetAll(), callback);
        }

        public List<FamigliaColore> GetAll()
        {
            List<FamigliaColore> retValue = null;

            try
            {
                var obj = from x in this.GetContext().AnagFamiglie
                          select new FamigliaColore
                          {
                              ID = x.IDFamiglia,
                              Descrizione = x.Descrizione
                          };

                if (obj.Any())
                {
                    retValue = obj.ToList();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Add(FamigliaColore data)
        {
            bool retValue = false;

            try
            {
                AnagFamiglie imp = new AnagFamiglie();
                imp.Descrizione = data.Descrizione;

                this.GetContext().AnagFamiglie.AddObject(imp);
                this.GetContext().SaveChanges();

                retValue = true;
            }
            catch (Exception ex)
            {
                // throw ex;
            }
            
            return retValue;
        }

        public bool Delete(FamigliaColore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().AnagFamiglie
                          where x.IDFamiglia == data.ID
                          select x;

                if (obj.Any())
                {
                    this.GetContext().AnagFamiglie.DeleteObject(obj.FirstOrDefault());
                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public bool Modify(FamigliaColore data)
        {
            bool retValue = false;

            try
            {
                var obj = from x in this.GetContext().AnagFamiglie
                          where x.IDFamiglia == data.ID
                          select x;

                if (obj.Any())
                {
                    AnagFamiglie imp = obj.FirstOrDefault();
                    imp.Descrizione = data.Descrizione;

                    this.GetContext().SaveChanges();

                    retValue = true;
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public FamigliaColore Get(int id)
        {
            FamigliaColore retValue = null;

            try
            {
                var obj = from x in this.GetContext().AnagFamiglie
                          where x.IDFamiglia == id
                          select new FamigliaColore
                          {
                              ID = x.IDFamiglia,
                              Descrizione = x.Descrizione
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public FamigliaColore Get(string descrizione)
        {
            FamigliaColore retValue = null;

            try
            {
                var obj = from x in this.GetContext().AnagFamiglie
                          where x.Descrizione == descrizione
                          select new FamigliaColore
                          {
                              ID = x.IDFamiglia,
                              Descrizione = x.Descrizione
                          };

                if (obj.Any())
                {
                    retValue = obj.FirstOrDefault();
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }

        public StringCollection GetFamiglieCombinate()
        {
            StringCollection retValue = null;

            try
            {
                var obj = (from x in this.GetContext().vw_FamiglieColoriXPolveri
                          where x.Famiglia.Contains(",")
                          select new BL.FamiglieColoriXPolveri
                          {
                              Famiglie = x.Famiglia
                          }).Distinct();

                if (obj.Any())
                {
                    retValue = new StringCollection();

                    FamigliaColoriFacade fcf = new FamigliaColoriFacade();
                    List<BL.FamigliaColore> famiglie = fcf.GetAll();

                    string[] ffs = null;
                    string temp = string.Empty;
                    foreach (BL.FamiglieColoriXPolveri item in obj.ToList())
                    {
                        ffs = item.Famiglie.Split(new string[] {","}, StringSplitOptions.RemoveEmptyEntries);

                        if (ffs.Length > 0)
                        {
                            foreach (string f in ffs)
                            {
                                temp += famiglie.Where(x => x.ID == int.Parse(f)).FirstOrDefault().Descrizione + ", ";
                            }
                        }

                        temp = temp.Trim().Substring(0, temp.Length-2);

                        retValue.Add(temp);
                        temp = string.Empty;
                    }
                }
            }
            catch (Exception ex)
            {
                // throw ex;
            }

            return retValue;
        }
    }
}
